/* RawToCompressed.h
 * 
 *  Author          : Alexander J. Yee
 *  Date Created    : 02/10/2018
 *  Last Modified   : 02/10/2018
 * 
 */

#pragma once
#ifndef ydv_DigitViewer_RawToCompressed_H
#define ydv_DigitViewer_RawToCompressed_H
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Dependencies
#include "PublicLibs/Types.h"
#include "PublicLibs/BasicLibs/Concurrency/BasicParallelizer.h"
namespace DigitViewer2{
namespace RawToCompressed{
    using namespace ymp;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Returns true if an invalid digit has been detected.
void i64_to_hex(char* raw, const u64_t* T, upL_t words);
void i64_to_dec(char* raw, const u64_t* T, upL_t words);
bool hex_to_i64(u64_t* T, const char* raw, upL_t words);
bool dec_to_i64(u64_t* T, const char* raw, upL_t words);
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Parallelized wrappers for the above functions.
using I64ToRawFunction = void (*)(char* raw, const u64_t* T, upL_t words);
using RawToI64Function = bool (*)(u64_t* T, const char* raw, upL_t words);
void i64_to_raw(
    I64ToRawFunction convert, upL_t digits_per_word,
    char* raw, const u64_t* T, upL_t words,
    BasicParallelizer& parallelizer, upL_t tds
);
bool raw_to_i64(
    RawToI64Function convert, upL_t digits_per_word,
    u64_t* T, const char* raw, upL_t words,
    BasicParallelizer& parallelizer, upL_t tds
);
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
}
}
#endif
